/*
    闭包介绍：
    闭包简单理解就是{}括起来的代码块,跟方法类似,可带参和不带参.
    闭包可以赋给一个变量也可以当做参数传递给一个方法,在方法中调用闭包.
 */


// 闭包类似一个方法的代码块
def c1 = {
    println "不带参数的闭包"
}

def c2 = {
    val -> println("带参数的闭包${val}")
}

// 定义方法形参是指定类型，接受不带参数的闭包的方法
def method1(Closure clo) {
    clo()
}

// 定义方法形参无指定类型，接受带参数闭包的方法
static def method2(clo) { // 参数是个变量名
    clo("参数val")
    clo.call("参数call")
}

// 调用方法， 传入闭包
method1 c1
method2 c2

// 调用方法时，直接定义新的闭包作为实际参数, 括号可以省略
method1 {
    println("传递闭包")
}

method2 {
    val -> println("直接传递带参数的闭包: ${val}")
}

def listener = {e-> println e}

Closure callback = {println "done"}

listener("a")


def isOdd = { int i -> i%2 != 0 }

println isOdd(3)

def isEven = { it%2 == 0 }

println(isEven.call(3))

def a1 = { a,b -> a+b }
def a2 = { int a, int b -> a+b }

println("=====")

def enclosed = {
    { -> delegate }.call()
}
println enclosed() == enclosed